package com.qf.cloud2203.gentoken.controller;

import cn.hutool.jwt.JWT;

import com.qf.cloud2203.domain.constants.Constants;
import com.qf.cloud2203.domain.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/redisvote")
public class RedisVoteController {


    @Autowired
    RedisTemplate redisTemplate;
    /**
     * token颁发接口。调用投票接口之前需要访问该接口获取token。
     * - 用户提交提交手机号码，每个手机号码在每分钟内可以获取一个token。
     * - 如果在1分钟内同一个手机号码多次调用该接口，返回相同的token。
     * - 如果超出一分钟，则颁发新的token。
     */
    @GetMapping("/gettoken")
    public ResultVo getToken(String phone) throws Exception {

        // 1. 检查redis中是否有该手机号对应的token，有直接返回
        String key = Constants.REDIS_JWT_PRE+phone;
        final String redisJwt = (String) redisTemplate.opsForValue().get(key);

        if (redisJwt!=null){
            // 缓存命中了，直接返回
            return ResultVo.ok(redisJwt);
        }

        // 2. 缓存未命中
        final String newToken = JWT.create().setSubject(phone)
                .setExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60))
                .setKey(Constants.SECRET.getBytes("utf-8"))
                .sign();

        // 3. 放到redis中
        redisTemplate.opsForValue().set(key,newToken,60, TimeUnit.SECONDS);

        return ResultVo.ok(newToken);
    }



}
